home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / tvmouse.exe / TEVENT.CPP < prev    next >
C/C++ Source or Header  |  1993-01-03  |  6KB  |  224 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tevent.cpp                                */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TEvent member functions                   */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision -  Version 1.0                             */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Copyright (c) 1991 by Borland International             */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*------------------------------------------------------------*/
  17.  
  18. #define Uses_TEventQueue
  19. #define Uses_TEvent
  20. #define Uses_TScreen
  21. #include <tv.h>
  22.  
  23. #if !defined( __DOS_H )
  24. #ifndef __DOS_H
  25. #include <dos.h>
  26. #endif
  27. #endif  // __DOS_H
  28.  
  29. #if !defined( __BIOS_H )
  30. #ifndef __BIOS_H
  31. #include <bios.h>
  32. #endif
  33. #endif  // __BIOS_H
  34.  
  35. #include "mouse.h"
  36.  
  37.  
  38. TEvent near TEventQueue::eventQueue[ eventQSize ] = { {0} };
  39. TEvent *near TEventQueue::eventQHead = TEventQueue::eventQueue;
  40. TEvent *near TEventQueue::eventQTail = TEventQueue::eventQueue;
  41. Boolean near TEventQueue::mouseIntFlag = False;
  42.  
  43. #ifdef PROTECT
  44. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( biosSeg, 0x006c );
  45. #else
  46. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( 0x0040, 0x006c );
  47. #endif
  48.  
  49. ushort near TEventQueue::eventCount = 0;
  50. Boolean near TEventQueue::mouseEvents = False;
  51. Boolean near TEventQueue::mouseReverse = False;
  52. ushort near TEventQueue::doubleDelay = 8;
  53. ushort near TEventQueue::repeatDelay = 8;
  54. ushort near TEventQueue::autoTicks = 0;
  55. ushort near TEventQueue::autoDelay = 0;
  56.  
  57. MouseEventType near TEventQueue::lastMouse;
  58. MouseEventType near TEventQueue::curMouse;
  59. MouseEventType near TEventQueue::downMouse;
  60. ushort near TEventQueue::downTicks = 0;
  61.  
  62. TEventQueue::TEventQueue()
  63. {
  64.     resume();
  65. }
  66.  
  67. void TEventQueue::resume()
  68. {
  69.     if( mouse.present() == False )
  70.         mouse.resume();
  71.     if( mouse.present() == False )
  72.         return;
  73.     mouse.getEvent( curMouse );
  74.     lastMouse = curMouse;
  75.     mouse.registerHandler( 0xFFFF, mouseInt );
  76.     mouseEvents = True;
  77.     mouse.show();
  78.     TMouse::setRange( TScreen::screenWidth-1, TScreen::screenHeight-1 );
  79. }
  80.  
  81. void TEventQueue::suspend()
  82. {
  83.     mouse.suspend();
  84. }
  85.  
  86. TEventQueue::~TEventQueue()
  87. {
  88.     suspend();
  89. }
  90.  
  91. void TEventQueue::getMouseEvent( TEvent& ev )
  92. {
  93.     if( mouseEvents == True )
  94.         {
  95.  
  96.         getMouseState( ev );
  97.  
  98.         if( ev.mouse.buttons == 0 && lastMouse.buttons != 0 )
  99.             {
  100.             ev.what = evMouseUp;
  101.             lastMouse = ev.mouse;
  102.             return;
  103.             }
  104.  
  105.         if( ev.mouse.buttons != 0 && lastMouse.buttons == 0 )
  106.             {
  107.             if( ev.mouse.buttons == downMouse.buttons &&
  108.                 ev.mouse.where == downMouse.where &&
  109.                 ev.what - downTicks <= doubleDelay )
  110.                     ev.mouse.doubleClick = True;
  111.  
  112.             downMouse = ev.mouse;
  113.             autoTicks = downTicks = ev.what;
  114.             autoDelay = repeatDelay;
  115.             ev.what = evMouseDown;
  116.             lastMouse = ev.mouse;
  117.             return;
  118.             }
  119.  
  120.         ev.mouse.buttons = lastMouse.buttons;
  121.  
  122.         if( ev.mouse.where != lastMouse.where )
  123.             {
  124.             ev.what = evMouseMove;
  125.             lastMouse = ev.mouse;
  126.             return;
  127.             }
  128.  
  129.         if( ev.mouse.buttons != 0 && ev.what - autoTicks > autoDelay )
  130.             {
  131.             autoTicks = ev.what;
  132.             autoDelay = 1;
  133.             ev.what = evMouseAuto;
  134.             lastMouse = ev.mouse;
  135.             return;
  136.             }
  137.         }
  138.  
  139.     ev.what = evNothing;
  140. }
  141.  
  142. void TEventQueue::getMouseState( TEvent & ev )
  143. {
  144.     disable();
  145.     if( eventCount == 0 )
  146.         {
  147.         ev.what = *Ticks;
  148.         ev.mouse = curMouse;
  149.         }
  150.     else
  151.         {
  152.         ev = *eventQHead;
  153.         if( ++eventQHead >= eventQueue + eventQSize )
  154.             eventQHead = eventQueue;
  155.         eventCount--;
  156.         }
  157.     enable();
  158.     if( mouseReverse != False && ev.mouse.buttons != 0 && ev.mouse.buttons != 3 )
  159.         ev.mouse.buttons ^= 3;
  160. }
  161.  
  162. #pragma saveregs
  163.  
  164. void huge TEventQueue::mouseInt()
  165. {
  166.     unsigned flag = _AX;
  167.     MouseEventType tempMouse;
  168.  
  169.     #if 0
  170.     tempMouse.buttons = _BL;
  171.     tempMouse.doubleClick = False;
  172.     tempMouse.where.x = _CX >> 3;
  173.     tempMouse.where.y = _DX >> 3;
  174.     #endif
  175.  
  176.     {
  177.         static MouseInfo    mi;
  178.  
  179.         ReadMouse (&mi);
  180.         tempMouse.buttons = mi.Buttons;
  181.         tempMouse.doubleClick = False;
  182.         tempMouse.where.x = mi.X;
  183.         tempMouse.where.y = mi.Y;
  184.         flag = (mi.Buttons != mi.OldButtons) ? 2 : 0;
  185.     }
  186.  
  187.     if( (flag & 0x1e) != 0 && eventCount < eventQSize )
  188.         {
  189.         eventQTail->what = *Ticks;
  190.         eventQTail->mouse = curMouse;
  191.         if( ++eventQTail >= eventQueue + eventQSize )
  192.             eventQTail = eventQueue;
  193.         eventCount++;
  194.         }
  195.  
  196.     curMouse = tempMouse;
  197.     mouseIntFlag = True;
  198. }
  199.  
  200. #pragma warn -asc
  201.  
  202. void TEvent::getKeyEvent()
  203. {
  204.     asm {
  205.         MOV AH,1;
  206.         INT 16h;
  207.         JNZ keyWaiting;
  208.         };
  209.     what = evNothing;
  210.     return;
  211.  
  212. keyWaiting:
  213.  
  214.     what = evKeyDown;
  215.     asm {
  216.         MOV AH,0;
  217.         INT 16h;
  218.         };
  219.     keyDown.keyCode = _AX;
  220.     return;
  221. }
  222.  
  223. #pragma warn .asc
  224.